"""
项目入口
"""

# -*- coding: utf-8 -*-

from geometry import Grid
from visualize import GridPlotter, CornerFlowPlotter
from cornerflow import CornerFlow
#from rect_sosi_flow import SourceSink

import matplotlib.pyplot as plt
# 2025
from parasolver import ParameterSolver
from sourcesink import SourceSink
from grid import PhysicalGrid, AuxiliaryGrid
from drawfigs import SosiFlowPlotter

# 导入案例文件
from cases import case_sosi, case_sosi_ND

def grid_test(length, height, N, org):
    """
    gridtest：创建网格、测试并进行可视化
    ---
    length: 流场长度（X方向） 单位：m
    height: 流场高度（Y方向） 单位：m
    N: 每个方向的节点数量
    org: 指定坐标位置（默认长度高度左下角为原点）
    """
    # 生成网格实例
    mesh = Grid(length, height, N, origin=org)
    # 创建 GridPlotter 实例并绘制网格
    grid_plotter = GridPlotter(mesh)
    #grid_plotter.plot_grid()

def dmsless(length: float, height: float):
    """
    计算无量纲参数

    参数：
    length (float): 流场长度（X方向），单位：m
    height (float): 流场高度（Y方向），单位：m

    返回：
    tuple: (K, Kp, AR, dml_l)
        - K (float): 复平面实部 (0.5 * dml_l)
        - Kp (float): 复平面虚部 (dml_h)
        - AR (float): 长高比
        - dml_l (float): 无量纲长度
    """
    if height == 0:
        print("错误：高度不能为 0")
        return None

    dml_h = height / height  # 恒等于 1
    dml_l = length / height
    AR = dml_l
    Kp = dml_h
    K = 0.5 * dml_l

    print(f"K = {K}")
    print(f"Kp = {Kp}")
    print(f"AR = {AR}")
    print(f"dml_l = {dml_l}")
    return (K, Kp, AR, dml_l)

def cornerflow_test(U0, height, corner_org):
    """
    90° 拐角流测试函数

    参数：
    ----------
    U0: float
        均匀来流速度 (m/s)
    height: float
        竖壁高度 (m)
    corner_org: tuple
        拐角位置坐标 (x, y)
    X: np.ndarray
        网格 X 坐标矩阵
    Y: np.ndarray
        网格 Y 坐标矩阵
    """
    # 计算拐角流强度 A
    A = U0 / (2 * height)  # 计算拐角流强度 (1/s)
    print(f"A: {A}")
    # 流动区域网格
    mesh_cf = Grid(height, height, 20, (0.0, 0.0))

    # 创建 90° 拐角流对象
    cf_90 = CornerFlow(A, corner_origin=corner_org)

    # 计算流函数 ψ 和势函数 φ (矢量化计算)
    _, phi_values, psi_values = cf_90.cplx_W(mesh_cf.X, mesh_cf.Y)

    # 计算速度场 (矢量化计算)
    magV_cf, vx_cf, vy_cf = cf_90.cplx_velocity(mesh_cf.X, mesh_cf.Y)

    # 创建 CornerFlowPlotter 并进行可视化
    plotter = CornerFlowPlotter(mesh_cf, cf_90)  # 只传入 X, Y 及拐角流信息

    #plotter.plot_psi(psi_values, title="流函数 (Stream Function)")
    #plotter.plot_phi(phi_values, title="势函数 (Potential Function)")
    #plotter.plot_flow_net(phi_values, psi_values, title="流网 (Flow Net)")
    # 仅显示方向
    #plotter.plot_velocity_field(vx_cf, vy_cf, title="速度场 (Velocity Field)")
    # 显示方向和大小
    plotter.plot_velocity_field(vx_cf, vy_cf, magV_cf, show_magnitude=True)


    print("✅ 90° 拐角流测试完成！")

def sosiflow_test(v_inlet, sosi_strength, sosi_length_pair, length, height):
    # 有量纲求参数
    SC_solver = ParameterSolver(length, height, characteristic=height, dimensional=False)
    C0, k0, k0_prime = SC_solver.solve()# 计算C0、模数 k0 和补模数 k0'
    print(f"计算得到的模数 k0 = {k0}")
    print(f"补模数 k0' = {k0_prime}")
    print(f"计算得到的系数 C0 = {C0}")
    # 计算无量纲网格参数
    K, Kp, AR, dml_l = dmsless(length, height)
    # 流动区域网格对象
    mesh_sosi = Grid(dml_l, Kp, 20, (dml_l/2, 0.0))

    so_org = (sosi_length_pair[0], height)
    si_org = (sosi_length_pair[1], height)

    # 创建源汇流动对象
    sosi_f = SourceSink(sosi_strength, so_org, si_org, C0, k0, length, height)

    # 计算复势w、流函数psi 、势函数phi(矢量化计算)
    #print(f"X tests: {mesh_sosi.X}")
    w_values, phi_values, psi_values = sosi_f.cplx_W(mesh_sosi.X, mesh_sosi.Y)  # 复位势

    # 复速度velocity_magnitude, vx, vy
    magV_sosi, vx_sosi, vy_sosi = sosi_f.cplx_velocity(mesh_sosi.X, mesh_sosi.Y)

    # 压力分布
    p_sosi, CP_sosi,dv2 = sosi_f.pressure(v_inlet, magV_sosi, vx_sosi, vy_sosi)

    # 创建 SosiFlowPlotter 并进行可视化
    plotter = SosiFlowPlotter(mesh_sosi, sosi_f)  # 只传入 X, Y 及源汇流信息

    # 绘制图形
    #plotter.plot_psi(psi_values)
    #plotter.plot_phi(phi_values)
    #plotter.plot_flow_net(phi_values, psi_values)
    #plotter.plot_velocity_field(vx_sosi, vy_sosi)
    # 仅显示方向
    #plotter.plot_velocity_field(vx_sosi, vy_sosi)
    # 显示方向和大小
    plotter.plot_velocity_field(vx_sosi, vy_sosi, magV_sosi, show_magnitude=True)
    #plotter.plot_velocity_magnitude(magV_sosi)
    #plotter.plot_pressure(CP_sosi)


# 仅在 main.py 作为主程序运行时执行
if __name__ == "__main__":
    # 案例运行
    print("......案例计算开始......")
    case_sosi()

    case_sosi_ND()






